package com.uade.sessionBeans.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import org.apache.log4j.Logger;

import com.uade.dao.ArticuloDAO;
import com.uade.dao.CompraDAO;
import com.uade.dao.ConfiguracionDAO;
import com.uade.dao.UsuarioDAO;
import com.uade.entities.CompraEntity;
import com.uade.entities.ConfiguracionEntity;
import com.uade.entities.ItemCompraEntity;
import com.uade.entities.UsuarioEntity;
import com.uade.model.Compra;
import com.uade.model.ItemCompra;
import com.uade.model.ModelUtilities;
import com.uade.model.Modelo;
import com.uade.model.exceptions.BusinessException;
import com.uade.model.exceptions.LogisticaMonitoreoException;
import com.uade.model.exceptions.NotFoundException;
import com.uade.sessionBeans.AdministradorCompra;
import com.uade.webservices.logisticaMonitoreo.LogCreator;

@Stateless
public class AdministradorCompraBean implements AdministradorCompra {

	// private static Logger log =
	// Logger.getLogger(AdministradorCompraBean.class);
	@EJB
	UsuarioDAO usuarioDAO;
	@EJB
	CompraDAO compraDAO;
	@EJB
	ArticuloDAO articuloDAO;
	@EJB
	ConfiguracionDAO configuracionDAO;
	private static Logger log = Logger.getLogger(AdministradorCompraBean.class);

	@Override
	public String updateCompra(String estado, int idCompra) {
		CompraEntity compraE = compraDAO.findById(Long.valueOf(idCompra));
		compraE.setEstado(estado);
		compraDAO.update(compraE);
		return null;
	}

	@Override
	public void recepcionEntrega(String estado, int idCompra) throws NotFoundException {
		CompraEntity compraE = compraDAO.findById(Long.valueOf(idCompra));
		if (compraE != null) {
			compraE.setEstado(estado);
			compraDAO.update(compraE);
		}else
			throw new NotFoundException("El id: "+ idCompra + " No corresponde a una compra existente en el portal" );
			
	}

	@Override
	/**
	 * Contiene la logica de la operacion de compra
	 * Obtiene los datos necesarios para generar la entity de compra
	 * persiste en la base local
	 * 
	 */
	public long confirmarCarrito(Compra compra) throws BusinessException,
			LogisticaMonitoreoException {

		// 1 Se obtiene el usuario
		UsuarioEntity usuarioE = usuarioDAO.findById(compra.getUsuario()
				.getId());
		// Setea la fecha actual
		compra.setFecha(ModelUtilities.setFecha());
		// Estado
		compra.setEstado(Modelo.GENERADA.toString());

		// 2 se arma la lista de items de compra
		List<ItemCompraEntity> itemsCompra = new ArrayList<ItemCompraEntity>();
		for (ItemCompra item : compra.getItems()) {
			// 3.1 Se obtiene el articulo
			ItemCompraEntity itemCompraE = new ItemCompraEntity(null,
					articuloDAO.findById(item.getArticulo().getIdProducto()),
					item.getCantidad(), item.getPrecio());
			itemsCompra.add(itemCompraE);
		}

		// 3 Se crea la compra
		return compraDAO.createCompra(new CompraEntity(null, compra.getIdModulo(), compra
				.getCoordenadaX(), compra.getCoordenadaY(), compra.getFecha(),
				itemsCompra, usuarioE, compra.getEstado(), compra.getPrecio()));

	}

	@Override
	public List<Compra> getCompras(int idUsuario) {

		List<Compra> compras = new ArrayList<Compra>();

		for (CompraEntity compraE : compraDAO.getListadoComprasUsuario(Long
				.valueOf(idUsuario))) {
			Compra compra = compraE.getCompra();
			compras.add(compra);
		}

		return compras;
	}

	@Override
	public void enviarLogLogisticaMonitoreo(String xml)
			throws BusinessException, LogisticaMonitoreoException {
		ConfiguracionEntity configuracion = configuracionDAO
				.obtenerConfiguracionLog();

		if (configuracion != null) {

			LogCreator logCreator = new LogCreator();
			logCreator.generarLog(xml, configuracion.getConfiguracion());
		} else {
			log.warn("No existe configuracion para realizar el log de la venta");
		}

	}

}
